package com.fansl.allround.study.designpattern.responsibilitychain;

import lombok.extern.slf4j.Slf4j;

/**
 * @author fansl
 * @Description: 抽象处理者
 * @date 2019/10/11 13:30
 */
@Slf4j
public abstract class Handler {

    private Handler nextHandler;

    /**
     * 每个处理者都必须对请求做出处理
     * @param request
     * @return
     */
    public final Response handleMessage(Request request){
        Response response = null;
        //判断是否是自己的处理级别
        if(this.canHandle(request)){
            log.info("自己对请求做出处理");
            response = this.process(request);
        }else {
            //不属于自己的处理级别
            if(this.nextHandler!=null){
                log.warn("其他处理者处理请求");
                response = this.nextHandler.handleMessage(request);
            }else {
                //没有合适的处理者，业务自行处理
                log.warn("没有合适的处理者，业务自行处理");
            }
        }
        return response;
    }

    /**
     * 设置下一级处理者
     * @param handler
     */
    public void setNextHandler(Handler handler) throws Exception {
        if(this.getClass().isInstance(handler)){
            throw new Exception("设置下一级处理者和当前处理者一致");
        }
        this.nextHandler = handler;
    }

    /**
     * 当前处理者是否可以处理
     * @param request
     * @return
     */
    protected abstract boolean canHandle(Request request);

    /**
     * 每个处理者必须实现处理的任务
     * @param request
     * @return
     */
    protected abstract Response process(Request request);
}
